#ifndef AUDIOCAPTURER_H
#define AUDIOCAPTURER_H

#include<functional>
#include"commonlooper.h"
#include"mediabase.h"

using std::function;

class AudioCapturer : public CommonLooper
{
public:
    AudioCapturer();
    virtual ~AudioCapturer();
    RET_CODE init(const Properties properties);
    void loop();
    void addCallback(function<void(uint8_t*, int32_t)> callback);//存储回调方法，会在loop方法中调用该方法
    // 这里的字段参数给的都是默认数据，其实无效，都会被传入的 properties 给覆盖, 取消硬编码，fix me
private:
    // 打开pcm文件——目前pcm文件用来测试，写死为s16格式，双通道，采样率48KHZ
    int openPcmFile(const char *fileName);
    // 读取pcm文件的数据
    int readPcmFile(uint8_t *pcmBuf, int32_t pcmBufSize);
    // 关闭pcm文件
    int closePcmFile();
    int _audio_test = 0; // 是否正在测试音频，1为测试环境
    std::string _input_pcm_name; // 输入的pcm文件名称
    FILE *_pcm_fp = NULL; //pcm文件
    int64_t _pcm_start_time = 0;//打开pcm文件时，现实时间的时间戳
    double _pcm_total_duration = 0;// pcm文件已经推流的总时长
    double _frame_duration = 23.2;// 每一帧的间隔时间，23.2333，目前是固定写死的，因为按照1024为一帧采样点，每秒48KHZ来算，一帧就23.222毫秒

    function<void(uint8_t*, int32_t)> _callback;//存储的回调方法
    uint8_t *_pcm_buf;//从pcm文件中读取的数据
    int32_t _pcm_buf_size; //pcm_buf的数据大小
    bool _is_first_time = false;//是否是第一次读取pcm数据
    int _sample_rate = 48000;//采样率
    int _nb_samples = 1024;//采样点数量| 样本数
    int _format = 1;//采样格式
    int _byte_per_samples = 2;//单个采样点的字节大小，由 _format 计算得来，如果是 s16，那么就是short，也就是2个字节。如果是fltp，那就是float，也就是4个字节。
    int _channels = 2;//通道数量

};

#endif // AUDIOCAPTURER_H
